#include <bits/stdc++.h>
using namespace std;

// 【题目】力扣724. 寻找数组的中心索引
// 【难度】简单
// 【提交】2025.10.09 https://leetcode.cn/problems/find-pivot-index/submissions/669082447/
// 【标签】前缀和；数组
class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
        }
        int ls = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (ls == sum - ls - nums[i]) {
                return i;
            }
            ls += nums[i];
        }
        return -1;
    }
};

/**
 * @brief 学习总结：
 * 一、题意与模型
 * 给定一个整数数组nums，返回数组的中心索引。
 * 中心索引定义：中心索引左侧所有元素相加的和等于右侧所有元素相加的和。
 * 如果数组不存在中心索引，返回-1。如果数组有多个中心索引，返回最左边的一个。
 * 模型：前缀和，通过计算数组总和和左侧累积和来高效判断中心索引。
 * 
 * 二、标准解法状态设计
 * 1. 计算数组所有元素的总和sum。
 * 2. 遍历数组，维护左侧元素和ls。
 * 3. 对于每个位置i，检查是否满足ls == sum - ls - nums[i]。
 * 4. 如果满足条件，返回i；否则继续遍历。
 * 
 * 三、你的实现思路
 * 使用前缀和技巧，在一次遍历中计算数组总和，在第二次遍历中寻找中心索引。
 * 通过维护左侧元素和，避免了重复计算。
 * 
 * 四、逐行注释（带细节提醒）
 * int sum = 0; // 数组总和
 * for (int i = 0; i < nums.size(); i++) { // 第一次遍历计算总和
 *     sum += nums[i];
 * }
 * 
 * int ls = 0; // 左侧元素和
 * for (int i = 0; i < nums.size(); i++) { // 第二次遍历寻找中心索引
 *     // 检查是否满足中心索引条件
 *     if (ls == sum - ls - nums[i]) {
 *         return i; // 找到中心索引
 *     }
 *     ls += nums[i]; // 更新左侧元素和
 * }
 * return -1; // 没有找到中心索引
 * 
 * 五、正确性证明
 * 对于任意位置i，左侧元素和为ls，右侧元素和为sum - ls - nums[i]。
 * 当ls = sum - ls - nums[i]时，即2*ls + nums[i] = sum，满足中心索引的定义。
 * 算法保证了从左到右遍历，因此会返回最左边的中心索引。
 * 
 * 六、复杂度
 * 时间：O(n)，需要两次遍历数组。
 * 空间：O(1)，只使用了常数级别的额外空间。
 * 
 * 七、优缺点分析
 * 优点：
 *   - 时间复杂度低，只需两次遍历；
 *   - 代码简洁，实现高效；
 *   - 空间复杂度低，无需额外数组。
 * 缺点：
 *   - 需要两次遍历，但无法进一步优化；
 *   - 对于空数组需要特殊处理。
 * 
 * 八、改进建议
 * 1. 可以添加输入验证：if (nums.empty()) return -1;
 * 2. 使用更明确的变量名（如 leftSum 代替 ls）来增强可读性；
 * 3. 对于教学场景，可以添加注释解释中心索引的数学原理。
 * 
 * 九、一句话总结
 * 前缀和技巧是解决"寻找数组中心索引"问题的高效方法，你的实现准确且简洁，
 * 展现了利用数学关系优化算法效率的能力。
 */